// 表单验证工具函数

/**
 * 验证用户名
 * @param {string} username 用户名
 * @returns {object} 验证结果
 */
export const validateUsername = (username) => {
  const result = { valid: true, message: '' }
  
  if (!username) {
    result.valid = false
    result.message = '请输入用户名'
  } else if (username.length < 3 || username.length > 20) {
    result.valid = false
    result.message = '用户名长度在 3 到 20 个字符'
  } else if (!/^[a-zA-Z0-9_]+$/.test(username)) {
    result.valid = false
    result.message = '用户名只能包含字母、数字和下划线'
  }
  
  return result
}

/**
 * 验证邮箱
 * @param {string} email 邮箱
 * @returns {object} 验证结果
 */
export const validateEmail = (email) => {
  const result = { valid: true, message: '' }
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
  
  if (!email) {
    result.valid = false
    result.message = '请输入邮箱地址'
  } else if (!emailRegex.test(email)) {
    result.valid = false
    result.message = '请输入正确的邮箱格式'
  }
  
  return result
}

/**
 * 验证手机号
 * @param {string} phone 手机号
 * @returns {object} 验证结果
 */
export const validatePhone = (phone) => {
  const result = { valid: true, message: '' }
  const phoneRegex = /^1[3-9]\d{9}$/
  
  if (!phone) {
    result.valid = false
    result.message = '请输入手机号码'
  } else if (!phoneRegex.test(phone)) {
    result.valid = false
    result.message = '请输入正确的手机号码'
  }
  
  return result
}

/**
 * 验证密码强度
 * @param {string} password 密码
 * @returns {object} 验证结果和强度等级
 */
export const validatePassword = (password) => {
  const result = { valid: true, message: '', strength: 0 }
  
  if (!password) {
    result.valid = false
    result.message = '请输入密码'
    return result
  }
  
  if (password.length < 8 || password.length > 20) {
    result.valid = false
    result.message = '密码长度在 8 到 20 个字符'
    return result
  }
  
  // 计算密码强度
  let strength = 0
  if (password.length >= 8) strength++
  if (/[a-z]/.test(password)) strength++
  if (/[A-Z]/.test(password)) strength++
  if (/\d/.test(password)) strength++
  if (/[@$!%*#?&]/.test(password)) strength++
  
  result.strength = Math.min(strength, 4)
  
  // 基本要求：至少包含字母和数字
  if (!/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d@$!%*#?&]{8,}$/.test(password)) {
    result.valid = false
    result.message = '密码必须包含字母和数字'
  }
  
  return result
}

/**
 * 验证确认密码
 * @param {string} password 原密码
 * @param {string} confirmPassword 确认密码
 * @returns {object} 验证结果
 */
export const validateConfirmPassword = (password, confirmPassword) => {
  const result = { valid: true, message: '' }
  
  if (!confirmPassword) {
    result.valid = false
    result.message = '请确认密码'
  } else if (password !== confirmPassword) {
    result.valid = false
    result.message = '两次输入的密码不一致'
  }
  
  return result
}

/**
 * 获取密码强度文本
 * @param {number} strength 强度等级 (0-4)
 * @returns {string} 强度文本
 */
export const getPasswordStrengthText = (strength) => {
  switch (strength) {
    case 0: return '请输入密码'
    case 1: return '密码强度：弱'
    case 2: return '密码强度：中等'
    case 3: return '密码强度：强'
    case 4: return '密码强度：很强'
    default: return ''
  }
}

/**
 * 获取密码强度颜色类
 * @param {number} strength 强度等级 (0-4)
 * @returns {string} CSS类名
 */
export const getPasswordStrengthClass = (strength) => {
  switch (strength) {
    case 0: return 'text-gray-400'
    case 1: return 'text-red-500'
    case 2: return 'text-yellow-500'
    case 3: return 'text-blue-500'
    case 4: return 'text-green-500'
    default: return 'text-gray-400'
  }
}

/**
 * 防抖函数
 * @param {Function} func 要防抖的函数
 * @param {number} delay 延迟时间（毫秒）
 * @returns {Function} 防抖后的函数
 */
export const debounce = (func, delay) => {
  let timeoutId
  return function (...args) {
    clearTimeout(timeoutId)
    timeoutId = setTimeout(() => func.apply(this, args), delay)
  }
}

/**
 * 节流函数
 * @param {Function} func 要节流的函数
 * @param {number} delay 延迟时间（毫秒）
 * @returns {Function} 节流后的函数
 */
export const throttle = (func, delay) => {
  let lastCall = 0
  return function (...args) {
    const now = Date.now()
    if (now - lastCall >= delay) {
      lastCall = now
      return func.apply(this, args)
    }
  }
}

/**
 * 格式化错误消息
 * @param {Error|string} error 错误对象或错误消息
 * @returns {string} 格式化后的错误消息
 */
export const formatErrorMessage = (error) => {
  if (typeof error === 'string') {
    return error
  }
  
  if (error?.response?.data?.message) {
    return error.response.data.message
  }
  
  if (error?.message) {
    return error.message
  }
  
  return '发生未知错误，请稍后重试'
}
